package com.guli.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.guli.oss.service.FileService;
import com.guli.oss.utils.ConstantPropertiesGet;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * @author zxc
 * @date 2023/04/01 15:40
 **/
@Service
public class FileServiceImpl implements FileService {

    @Override
    public String uploadFile(MultipartFile file) {
        // 工具类获取值
        String endPoint = ConstantPropertiesGet.END_POINT;
        String keyId = ConstantPropertiesGet.ACCESS_KEY_ID;
        String keySecret = ConstantPropertiesGet.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesGet.BUCKET_NAME;

        try {
            // 创建OSS实例
            OSS ossClient = new OSSClientBuilder().build(endPoint , keyId , keySecret);
            // 获取所上传文件的输入流
            InputStream inputStream = file.getInputStream();
            /**
             * 问题 ：若是多次上传相同名称的文件，后置上传的文件会将前面所上传的文件覆盖
             * ===》
             * 解决方法 ：即，给所要上传到OSS文件路径进行区分（即，在上传文件之前，加上日期 && uuid）
             * 目的 ：即，为了保证所要上传到的OSS文件路径唯一
             */
            String uuid = UUID.randomUUID().toString().replace("-","");
            String date = new DateTime().toString("yyyy/MM/dd");
            // 获取所上传文件的名称
            String filename = date + "/" + uuid + "/" + file.getOriginalFilename();

            System.out.println(filename);
            // 调用OSS方法是，实现文件上传
            /**
             * （1）第一个参数 ：Bucket名称
             * （2）第二个参数 ：上传到oss文件路径和文件名称
             *  ===>即，所要被上传的文件 要被上传到那个指定的oss文件夹中;
             * （3）第三个参数 ：所要上传文件的输入流
             *
             */
            ossClient.putObject(bucketName , filename , inputStream);
            // 关闭ossClient
            ossClient.shutdown();
            // 返回上传到OSS的文件路径
            String url = "https://" + bucketName + "." + endPoint + "/" + filename;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传到OSS失败！！！";
        }
    }
}
